package base.collection_demo.demo04;

import java.util.*;

/**
 * 前一个斗地主案例,详见本模块的demo02
 * 斗地主综合案例: 有序版本(从小到大)
 * 1.准备牌
 * 2.洗牌
 * 3.发牌
 * 4.排序
 * 5.看牌
 */
public class Client {
    public static void main(String[] args) {
        // 方式一: 完成不了
        /*
         * 因为扑克中,2是比其余数字要大的,从2以后,数字的自然大小代表了真实大小.
         * 无法将发牌后的玩家牌按照从小到大顺序排列,因此必须在准备牌时(从小到大),这个顺序号要记录下来,
         * 洗牌后,按照%3发完牌,再将每个玩家手中的牌,按照顺序号从小到大排列即可.
         */
//        testList();

        // 方式二: 可以完成本案例
        testList2();
    }

    private static void testList2() {
        List<String> colors = Arrays.asList("♥", "♠", "♣", "♦");
        List<String> numbers = Arrays.asList("3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2");

        Map<Integer, String> poker = new HashMap<>(20);
        Integer index =0;
        for (int i = 0; i < numbers.size(); i++) {
            for (int j = 0; j < colors.size(); j++) {
                poker.put(index++,numbers.get(i)+colors.get(j));
            }
        }
//        System.out.println(poker);
        poker.put(index++,"小王");
        poker.put(index,"大王");
//        System.out.println(poker);

        // 将顺序号打乱
        // 获取键的集合set
        Set<Integer> keySet = poker.keySet();
        // 转换为数组
        Integer[] keys = keySet.toArray(new Integer[0]);
        // 数组转换为List集合
        List<Integer> listKey = Arrays.asList(keys);
        // 排序
//        Collections.sort(listKey);
        // 打乱
        Collections.shuffle(listKey);
        System.out.println(listKey);

        // 发牌
        List<Integer> ldh = new ArrayList<>();
        List<Integer> zrf = new ArrayList<>();
        List<Integer> zxc = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();
        for (int i = 0; i < listKey.size(); i++) {
            Integer key = listKey.get(i);
            if (i>=51) {
                dipai.add(key);
            }else if(i%3==0){
                ldh.add(key);
            }else if(i%3==1){
                zrf.add(key);
            }else if(i%3==2){
                zxc.add(key);
            }
        }

        // 排序
        Collections.sort(ldh);
        Collections.sort(zrf);
        Collections.sort(zxc);
        Collections.sort(dipai);

        // 看牌
        kanPai("刘德华", ldh, poker);
        kanPai("周润发", zrf, poker);
        kanPai("周星驰", zxc, poker);
        kanPai("底牌", dipai, poker);
    }

    public static void kanPai(String name, List<Integer> keyList, Map<Integer, String> poker){
        System.out.print(name+": ");
        for (Integer key : keyList) {
            String value = poker.get(key);
            System.out.print(value +" ");
        }
        System.out.println();//换行
    }

    public static void testList(){
        /*
         * 1.准备牌
         */
        List<String> colors = Arrays.asList("♥", "♠", "♣", "♦");
        List<String> numbers = Arrays.asList("2", "A", "K", "Q", "J", "10", "9", "8", "7","6","5","4","3");
        ArrayList<String> poker = new ArrayList<>();
        for (String number : numbers) {
            for (String color : colors) {
                poker.add(number + color);
            }
        }
        System.out.println("有大小顺序的扑克: "+poker);
        /*
         * 2.洗牌
         */
        Collections.shuffle(poker);
        System.out.println("洗牌后的扑克: "+poker);
        /*
         * 3.发牌
         */
        // 定义4个集合存储3个玩家和底牌
        List<String> ldh = new ArrayList<>();
        List<String> zrf = new ArrayList<>();
        List<String> zxc = new ArrayList<>();
        List<String> dipai = new ArrayList<>();

        for (int i = 0; i < poker.size(); i++) {
            String s = poker.get(i);
            if (i>=51) {
                dipai.add(s);
            }else if(i%3==0){
                ldh.add(s);
            }else if(i%3==1){
                zrf.add(s);
            }else if(i%3==2){
                zxc.add(s);
            }
        }

        /*
         * 4.给每个玩家牌排序
         */
        System.out.println(ldh);//[4♦, A♣, 4♠, 4♣, 9♦, 5♥, 6♦, 8♣, 10♥, 7♥, 2♣, K♣, 2♦, K♦, 3♦, K♠, 3♠]
        Collections.sort(ldh);
        System.out.println(ldh);//[10♥, 2♣, 2♦, 3♠, 3♦, 4♠, 4♣, 4♦, 5♥, 6♦, 7♥, 8♣, 9♦, A♣, K♠, K♣, K♦]
        /*
         * 从上可以看出,洗牌后的List按照%3方式给各个玩家发牌,最终准备给发完牌的玩家排序时,采用的是自然排序,此例子中是String的自然排序.
         * 按照字符串每位进行比较,因此数字和J Q K无法保证谁在前后(即使在Java中我们知道JQK在数字之前,但也不符合本题意,2可要排在JQK前的).
         * 同时,字符串"10"比"3"小,也是不符合本意
         */
        System.out.println("2".compareTo("J"));


    }




}
